package com.zhong.system.service;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhong.common.constant.UserConstants;
import com.zhong.common.exception.ServiceException;
import com.zhong.common.utils.StringUtils;
import com.zhong.common.utils.WrapperUtils;
import com.zhong.system.domain.SysPost;
import com.zhong.system.domain.SysUserPost;
import com.zhong.system.mapper.SysPostMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 岗位信息 服务层处理
 *
 * @author zhongzc
 */
@Service
@RequiredArgsConstructor
public class SysPostService extends ServiceImpl<SysPostMapper, SysPost>
{
    private final SysUserPostService userPostService;

    public Page<SysPost> findPage(SysPost sysPost){
        return page(sysPost.getPage(), WrapperUtils.getLambdaQueryWrapper(sysPost));
    }

    /**
     * 查询岗位信息集合
     *
     * @param post 岗位信息
     * @return 岗位信息集合
     */
    public List<SysPost> findList(SysPost post)
    {
        return list(WrapperUtils.getLambdaQueryWrapper(post));
    }

    public List<SysPost> allList(){
        return list(Wrappers.<SysPost>lambdaQuery().eq(SysPost::getStatus,"0").orderByAsc(SysPost::getPostSort));
    }

    /**
     * 根据用户ID获取岗位选择框列表
     *
     * @param userId 用户ID
     * @return 选中岗位ID列表
     */
    public List<String> findListByUserId(String userId)
    {
        List<SysUserPost> upList = userPostService.findListByUserId(userId);
        if(!upList.isEmpty()){
            return list(Wrappers.<SysPost>lambdaQuery().in(SysPost::getId,upList.stream().map(SysUserPost::getPostId).collect(Collectors.toList())).eq(SysPost::getStatus,"0"))
                    .stream().map(SysPost::getId).collect(Collectors.toList());
        }
        return Collections.EMPTY_LIST;
    }

    /**
     * 校验岗位名称是否唯一
     *
     * @param post 岗位信息
     * @return 结果
     */
    public boolean checkPostNameUnique(SysPost post)
    {
        SysPost info = getOne(Wrappers.<SysPost>lambdaQuery().eq(SysPost::getPostName,post.getPostName()),false);
        if (StringUtils.isNotNull(info) && !info.getId().equals(post.getId()))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验岗位编码是否唯一
     *
     * @param post 岗位信息
     * @return 结果
     */
    public boolean checkPostCodeUnique(SysPost post)
    {
        SysPost info = getOne(Wrappers.<SysPost>lambdaQuery().eq(SysPost::getPostCode,post.getPostCode()),false);
        if (StringUtils.isNotNull(info) && !info.getId().equals(post.getId()))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 批量删除岗位信息
     *
     * @param ids 需要删除的岗位ID
     * @return 结果
     */
    public boolean deleteIds(String[] ids)
    {
        for (String id : ids)
        {
            if (userPostService.countByPostId(id) > 0)
            {
                SysPost post = getById(id);
                throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName()));
            }
        }
        return removeByIds(Arrays.asList(ids));
    }
}
